查看原文
其他

高级函数——map()和reduce()

爬虫俱乐部 Stata and Python数据分析 2023-10-24

本文作者:张欣怡,中南财经政法大学统计与数学学院

本文编辑:周一鸣

技术总编:王玉婷

Stata and Python 数据分析

爬虫俱乐部Stata基础课程Stata进阶课程Python课程可在小鹅通平台查看,欢迎大家多多支持订阅!如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~
在Python中,如果给定一个序列,我们可以通过for循环进行迭代;而高级函数map()和reduce()将运算规则抽象化,同样可以起到迭代作用,并且过程更加清晰简洁,让我们一起来看看具体的用法吧。
1. map() 
map()函数的语法为:
map(function, *iterables) -> value

其中,function为可调用的函数,*iterables为输入的一个或多个可迭代序列,可以是列表、集合、元组、字典或字符串 。map()将指定函数映射至序列中的所有元素,并生成一个函数返回值的新序列,如下图所示:

首先,让我们来看一个简单的例子:假设一组单词中错误地出现大写字母,需将其替换成小写字母,为了通过指定函数修正列表中的每个元素,可以借助map函数来实现。
map(str.lower,['appLE','pEach','Banana'])

此时的输出结果为map对象(object)。在python3中,map()传入的第一个参数是函数对象本身,输出结果仅返回至迭代器,无法直接返回序列。这是因为每个元素均被单独处理,原始序列并未被修改,使用map函数需要创建新的序列来储存输出的结果,此时就需要借助list()、tuple()等内置函数处理并返回具体的序列。
list(map(str.lower,['appLE','pEach','BanaNa']))

再来看一个具体的例子:如果我们想要输出指定列表中每个元素的长度,就可以借助map函数,len作为调用函数。
strings=['stata','and','python']lengths=list(map(len,strings))lengths
输出结果为:

采用列表生成式也可以得到一致的结果。列表生产式是通过函数传递参数,并在过程中修改序列中的每个元素。因此,map函数映射的过程可以看作是序列推导的过程。
strings=['stata','and','python']lengths=[len(x) for x in strings]lengths
输出结果为:

map函数可以同时处理多个序列,需要注意是否定义了支持多个参数的函数或多个序列的长度是否一致。一般来说,在序列长度不一致时,输出结果取决于最短的序列。
def multiply_numbers(x,y,z): return x*y*zlist(map(multiply_numbers,{1,2,3,4,5},{2,3,4,5},{3,4,5}))

配合lambda匿名函数可以简化定义函数的过程,直接指定参数传递的方式,同样可以作用于多个序列。
list(map(lambda x, y:(x+y,x*y),{1,2,3,4,5},{2,3,4,5}))

2. reduce() 
reduce()函数的语法为:
reduce(function, sequence[, initial]) -> value

其中,function为可调用的函数,sequence为输入的可迭代序列,initial为可选的初始参数。reduce()可以看作是序列中元素的合并,通过指定函数处理序列中的第一、二个元素,得到的结果与第三个元素配合处理,逐项累积直至得到最终结果为止,具体的步骤如下图所示:

需要注意的是,reduce()作为内置函数在python2中可以直接使用;而在python3中,需要从functools模块中引用函数reduce()。
from functools import reducedef multiply_numbers(x,y): return x*yreduce(multiply_numbers,range(1,6))

输出结果为:

在这个例子中,reduce函数可以便捷地实现数字1至5的连乘。与map函数类似,reduce函数可以与lambda匿名函数结合使用。比如,我们需要拼接一组字符,将字符转换为字符串的形式,可以通过lambda匿名函数确定字符拼接方式,reduce函数实现字符的合并,需要注意lambda表达式中有两个参数。
from functools import reduceseq=['p','y','t','h','o','n']print(reduce(lambda x, y: x+y, seq))

输出结果为:

上述过程也可以通过for循环实现,但是循环代码无法清晰地展现字符的拼接方式,且较为繁琐。
seq=['p','y','t','h','o','n']for i in range(len(seq)): if len(seq)!=1: outcome = seq[0]+seq[1] seq.remove(seq[0]) seq[0] = outcome else: breakprint(seq)

输出结果为:

map()和reduce()可以配合使用,比如:将字符(str)转化成整数(int)。
def func(x, y): return x * 10 + ydictionary={'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5}def numbers(i): return dictionary[i]from functools import reducereduce(func, map(numbers, '3145'))

输出结果为:

在这个例子中,第一个参数为定义函数numbers,可以根据输入值返回字典键值对在该索引位置时的元素,比如当i=1时,返回索引位置为1的元素;第二个参数为'3145',通过map函数输出元素3、1、4、5,再经过reduce函数,即可将字符转换为整数。
总的来说,map函数是映射元素,而 reduce函数是合并元素,二者均起到迭代的作用。其主要区别是:map函数对序列中的每个元素进行处理,可以输入多个序列,但是在python3中函数返回值处于迭代器中,需要另外创建新列表存储结果;而reduce函数则是逐项两两处理序列中的元素,只能输入一个序列,在调用函数时需要引入functools模块。
以上是对高级函数map()和reduce()的介绍,大家一起灵活应用起来吧。
ENJOY THE SPRING

重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。




对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!




往期推文推荐 

Stata绘制条形图的进阶用法

快来看看武汉的房价是不是又双叒叕涨了!Python 常见内置函数(二)

Stata绘制饼形图的进阶用法

Python标准库--logging模块盲区探索——Stata的读写极限Camelot提取PDF表格:一页多表、多页一表

Stata绘图系列——条形图绘制

Python常见内置函数(一)Stata绘图系列——饼形图绘制【爬虫实战】深交所服务业年报数据

“挂羊头卖狗肉”?

Python与excel交互--xlsxwriter模块

cnmapsearch——离公司最近的快餐店在哪

Python中的异常处理 Python交互式数据可视化——酷炫的Altair库 hk系列命令(3)—— hktrade hk系列命令(2)—— hkar
     关于我们 

   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:1)必须原创,禁止抄袭;2)必须准确,详细,有例子,有截图;注意事项:1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存